package com.blkj.iam.common.util;

import org.apache.commons.lang3.RandomUtils;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @description: 登录ID生成器
 * @author: Ethan
 * @create: 2025-04-28
 **/
public class LoginIdGenerator {

    // 使用 AtomicLong 生成全局唯一的序列号
    private static final AtomicLong globalSequence = new AtomicLong(generateRandomSeed());

    /**
     * 生成一个随机的初始种子值
     *
     * @return 随机种子值
     */
    private static long generateRandomSeed() {
        // 生成一个随机的8位数字作为初始种子值
        return (long) (Math.random() * 100000000);
    }

    /**
     * 根据用户名生成唯一的 loginId，长度为8位，每次生成的都不一样
     *
     * @param username 用户名
     * @return 唯一的 loginId
     */
    public static long generateUnique(String username) {
        // 获取全局唯一的序列号
        long seqValue = RandomUtils.nextLong();

        // 将用户名的哈希值与序列号组合，确保唯一性
        long hash = username.hashCode();

        // 生成8位的 loginId
        long loginId = (hash ^ seqValue) & 0xFFFFFFFFL;

        // 如果生成的 loginId 小于8位，可以通过左移补足8位
        if (loginId < 10000000) {
            loginId += 10000000; // 补足到8位
        }

        return loginId;
    }

    /**
     * 根据用户名生成唯一的 loginId，长度为8位，每次生成的都一样
     *
     * @param username 用户名
     * @return 唯一的 loginId
     */
    public static long generateFixed(String username) {
        // 将用户名的哈希值作为 loginId
        long hash = username.hashCode();

        // 生成8位的 loginId
        long loginId = hash & 0xFFFFFFFFL;

        // 如果生成的 loginId 小于8位，可以通过左移补足8位
        if (loginId < 10000000) {
            loginId += 10000000; // 补足到8位
        }

        return loginId;
    }

    public static void main(String[] args) {
        // 测试
        System.out.println("Unique loginId for user1: " + generateUnique("user1"));
        System.out.println("Unique loginId for user1: " + generateUnique("user1"));
        System.out.println("Unique loginId for user2: " + generateUnique("user2"));
        System.out.println("Unique loginId for user2: " + generateUnique("user2"));

        System.out.println("Fixed loginId for user1: " + generateFixed("user1"));
        System.out.println("Fixed loginId for user1: " + generateFixed("user1"));
        System.out.println("Fixed loginId for user2: " + generateFixed("user2"));
        System.out.println("Fixed loginId for user2: " + generateFixed("user2"));
    }
}